/*
 * @Author: wwssaabb
 * @Date: 2021-08-14 09:45:07
 * @LastEditTime: 2021-08-14 15:49:01
 * @FilePath: \ts_demo\demo\keyof.ts
 */

/* 
  keyof 索引查询
  对应任何类型T，keyof T 的结果应该为该类型上所有的共有属性key的联合
*/


//接口约束对象
interface Eg1 {
  name: string;
  readonly age: number; 
}

type T1 = keyof Eg1;//T1 = "name" | "age"

/* 
  修饰符：
  private，私有的，只能在类内部访问
  public，默认，公开的，表示可以自由的访问程序里定义的成员
  protected，受保护的，类的内部和子类可以进行访问
  readonly，表示属性为只读属性，必须在声明时或构造函数里初始化
*/
class Eg2 {
  private name: string;
  public readonly age: number;
  protected home: string;
}

class Eg3 {
  private name: string;
  public readonly age: number;
  public sex: string;
  protected home: string;
}

/* 
  T2是被age所约束的
  name和home不是共有属性，无法被keyof获取到
*/
type T2 = keyof Eg2;
type T3 = keyof Eg3;

export {}
